package lock;

/**
 * synchronized 反编译查看字节码案例
 *
 * @author codefish
 * @version 1.0
 * @date 2022/08/01 下午 04:16
 */
public class SynchronizedReverseDemo {

    final Object lockedObj = new Object();


    public void m1() {

        //进入同步代码块时执行第6行的monitorenter指令
        synchronized (lockedObj) {
            //执行第12行指令
            //执行代码块中的代码时如果抛出异常，执行第22行monitorexit，表示异常退出代码块
            System.out.println("hello synchronized---");
            // 正常退出同步代码块，执行第16行monitorexit
        }
    }

    /**
     * 普通同步方法的标识(flags)中含有ACC_SYNCHRONIZED，
     * 标识该方法是一个普通同步方法，进入方法前尝试获取对对象实例的monitor锁
     */
    public synchronized void m2() {
        System.out.println("hello synchronized m2---");
    }

    /**
     * 静态同步方法的标识(flags)中处了含有ACC_SYNCHRONIZED，
     * 还含有ACC_STATIC，标识该方法是一个静态同步方法，进入方法前尝试获取对类的monitor锁
     */
    public static synchronized void m3() {
        System.out.println("hello static synchronized m3---");
    }


    public static void main(String[] args) {

    }
}
